home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 5 / Gekikoh Dennoh Club Vol. 5 (Japan).7z / Gekikoh Dennoh Club Vol. 5 (Japan) (Track 01).bin / internet / tcppack / tcppackb.lzh / src / samples / ifconfig.c < prev    next >
C/C++ Source or Header  |  1994-08-07  |  5KB  |  252 lines

  1. /*
  2.  * ifconfig.c - configure interfaces.
  3.  *
  4.  * Copyright (C) 1994 Tomoaki Tada/F.C.T.
  5.  */
  6.  
  7. static char *rcsid = "$Id: ifconfig.c,v 1.4 1994/08/04 05:02:08 Niggle Exp $";
  8.  
  9. /*
  10.  * $Log: ifconfig.c,v $
  11.  * Revision 1.4  1994/08/04  05:02:08  Niggle
  12.  * inetdé¬ÅφÆôé╡é─éóé╚éóÅΩìçé╠ò\Īé≡ò╧ìX
  13.  *
  14.  * Revision 1.3  1994/07/23  01:01:19  Niggle
  15.  * Å¡üXò╧ìX
  16.  *
  17.  * Revision 1.2  1994/07/18  12:49:59  Niggle
  18.  * hostnameé┼é╠ÄwÆΦé≡ë┬ö\é╔
  19.  * netmask, broadcast é≡Ä⌐ô«ôIé╔ì∞ɼé╖éΘéµéñé╔ò╧ìX
  20.  *
  21.  * Revision 1.1  1994/06/22  01:58:08  Niggle
  22.  * Initial revision
  23.  *
  24.  */
  25.  
  26. #include<stdio.h>
  27. #include<string.h>
  28.  
  29. #include"network.h"
  30.  
  31. static void ifconfig (int, char **);
  32. static void display_iface_stat (iface *);
  33. static int config_sub (iface *, int, char **);
  34. static long make_netmask (long);
  35. static long make_broad_cast (long, long);
  36.  
  37. static char *num[] = {
  38.   "",
  39.   "twice",
  40.   "three times",
  41.   "many times",
  42. };
  43.  
  44. /************************************************
  45.  *                        *
  46.  ************************************************/
  47. int
  48. main (int argc, char **argv)
  49. {
  50.   long version = _get_version ();
  51.  
  52.   if (version == -1)
  53.     {
  54.       fprintf (stderr, "TCP/IP driveré═ÅφÆôé╡é─éóé▄é╣é±\n");
  55.       return -1;
  56.     }
  57.  
  58.   ifconfig (argc, argv);
  59.   return 0;
  60. }
  61.  
  62. /************************************************
  63.  *                        *
  64.  ************************************************/
  65. static void
  66. ifconfig (int argc, char **argv)
  67. {
  68.   char *i_name;
  69.   iface *p;
  70.  
  71.   if (argc == 1)
  72.     return;
  73.  
  74.   i_name = argv[1];
  75.   p = get_new_iface (i_name);
  76.   if (!p)
  77.     {
  78.       printf ("no such interface\n");
  79.       return;
  80.     }
  81.  
  82.   if (argc == 2)
  83.     display_iface_stat (p);
  84.   else
  85.     {
  86.       /* Ä└ì█é╔Åæì₧é▐ */
  87.       config_sub (p, argc - 1, &argv[1]);
  88.     }
  89.  
  90.   /* link é╡é╚é¿é╖ */
  91.   link_new_iface (p);
  92.  
  93.   return;
  94. }
  95.  
  96. /************************************************
  97.  *                        *
  98.  ************************************************/
  99. static void
  100. display_iface_stat (iface *p)
  101. {
  102.   unsigned int flag;
  103.   char ip_addr[32], broadcast[32];
  104.  
  105.   flag = p->flag;
  106.   printf ("%s: flags=%x<", p->name, flag);
  107.   if (flag & IFACE_UP)
  108.     printf ("UP");
  109.   else
  110.     printf ("DOWN");
  111.   if (flag & IFACE_RUNNING)
  112.     printf (",RUNNING");
  113.   if (flag & IFACE_NOARP)
  114.     printf (",NOARP");
  115.   if (flag & IFACE_NOTRAIL)
  116.     printf (",NOTRAILERS");
  117.   if (flag & IFACE_BROAD)
  118.     printf (",BROADCAST");
  119.   if (flag & IFACE_LOOPBACK)
  120.     printf (",LOOPBACK");
  121.   if (flag & IFACE_PTP)
  122.     printf (",POINTOPOINT");
  123.   printf (">\n");
  124.  
  125.   n2a_ipaddr (p->my_ip_addr, ip_addr);
  126.   n2a_ipaddr (p->broad_cast, broadcast);
  127.   printf ("\tinet %s netmask 0x%8.8x", ip_addr, p->net_mask);
  128.   if (flag & IFACE_BROAD)
  129.     printf (" broadcast %s\n", broadcast);
  130.   else
  131.     printf ("\n");
  132. }
  133.  
  134. /************************************************
  135.  *                        *
  136.  ************************************************/
  137. static int
  138. config_sub (iface * my_iface, int argc, char **argv)
  139. {
  140.   int i, addr_p;
  141.   int up_p, down_p;
  142.   long my_ip, netmask, broadcast;
  143.  
  144.   addr_p = 0;
  145.   my_ip = my_iface->my_ip_addr;
  146.   netmask = my_iface->net_mask;
  147.   broadcast = my_iface->broad_cast;
  148.   up_p = 0; down_p = 0;
  149.   for (i = 1; i < argc; i++)
  150.     {
  151.       if (!strcmp (argv[i], "up"))
  152.     up_p = 1;
  153.       else if (!strcmp (argv[i], "down"))
  154.     down_p = 1;
  155.       else if (!strcmp (argv[i], "broadcast"))
  156.     {
  157.       if (i + 1 < argc)
  158.         broadcast = a2n_ipaddr (argv[++i]);
  159.     }
  160.       else if (!strcmp (argv[i], "netmask"))
  161.     {
  162.       if (i + 1 < argc)
  163.         netmask = a2n_ipaddr (argv[++i]);
  164.     }
  165.       else
  166.     {
  167.       if (addr_p)
  168.         {
  169.           if (addr_p > 2)
  170.         addr_p = 2;
  171.           fprintf (stderr, "Warning: network address was specified %s.\n", num[addr_p]);
  172.         }
  173.  
  174.       if (isipaddr (argv[i]))
  175.         my_ip = a2n_ipaddr (argv[i]);
  176.       else
  177.         {
  178.           struct hostent *h;
  179.  
  180.           h = gethostbyname (argv[i]);
  181.           if (!h)
  182.         {
  183.           fprintf (stderr, "Host name(%s) look up failure.\n", argv[i]);
  184.           return 0;
  185.         }
  186.           my_ip = *(long *)h->h_addr;
  187.         }
  188.       addr_p++;
  189.     }
  190.     }
  191.  
  192.   my_iface->my_ip_addr = my_ip;
  193.  
  194.   if (!netmask)
  195.     netmask = make_netmask (my_ip);
  196.   my_iface->net_mask = netmask;
  197.  
  198.   if (!broadcast)
  199.     broadcast = make_broad_cast (my_ip, netmask);
  200.   my_iface->broad_cast = broadcast;
  201.  
  202.   if (!(my_iface->flag & IFACE_UP) && up_p && !down_p)
  203.     my_iface->flag |= IFACE_UP;
  204.   else if ((my_iface->flag & IFACE_UP) && down_p && !up_p)
  205.     my_iface->stop (my_iface);
  206.  
  207.   return 0;
  208. }
  209.  
  210. /************************************************
  211.  *                        *
  212.  ************************************************/
  213. static long
  214. make_netmask (long target)
  215. {
  216.   long tmp;
  217.   long result;
  218.   int class;
  219.  
  220.   tmp = target >> 32 - 4;
  221.   for (class = 0; class < 3; class++)
  222.     {
  223.       if (!(tmp & (1 << 3 - class)))
  224.     break;
  225.     }
  226.  
  227.   switch (class)
  228.     {
  229.     case 0:    /* class A */
  230.       result = 0xff000000;
  231.       break;
  232.     case 1:    /* class B */
  233.       result = 0xffff0000;
  234.       break;
  235.     case 2:    /* class C */
  236.       result = 0xffffff00;
  237.       break;
  238.     default:
  239.       result = 0;
  240.     }
  241.   return result;
  242. }
  243.  
  244. /************************************************
  245.  *                        *
  246.  ************************************************/
  247. static long
  248. make_broad_cast (long target, long mask)
  249. {
  250.   return (0xffffffff & ~mask) | target;
  251. }
  252.